package com.bytenebula.asteroid.controller;

import com.bytenebula.asteroid.ResponseResult;
import com.bytenebula.asteroid.entity.dto.MetaDatabaseDTO;
import com.bytenebula.asteroid.entity.vo.MetaDatabaseVO;
import com.mybatisflex.core.paginate.Page;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.beans.factory.annotation.Autowired;
import com.bytenebula.asteroid.entity.MetaDatabase;
import com.bytenebula.asteroid.service.MetaDatabaseService;
import org.springframework.web.bind.annotation.RestController;

import java.util.ArrayList;
import java.util.List;

/**
 *  控制层。
 *
 * @author patrick
 * @since 2024-09-15
 */
@Tag(name = "Metadata Database Service")
@RestController
@RequestMapping("/meta/database")
@ResponseResult
public class MetaDatabaseController {

    @Autowired
    private MetaDatabaseService service;

    /**
     * 添加数据库对象
     *
     * @param database 待添加的数据库对象
     * @return {@code true} 添加成功，{@code false} 添加失败
     */
    @PostMapping("/")
    public boolean save(@RequestBody MetaDatabase database) {
        return service.save(database);
    }

    /**
     * 根据主键删除数据库对象
     *
     * @param id 主键
     * @return {@code true} 删除成功，{@code false} 删除失败
     */
    @DeleteMapping("{id}")
    public boolean remove(@PathVariable Integer id) {
        return service.removeById(id);
    }

    /**
     * 根据Id更新数据库对象
     *
     * @param database 更新数据库对象
     * @return {@code true} 更新成功，{@code false} 更新失败
     */
    @PutMapping("")
    public boolean update(@RequestBody MetaDatabase database) {
        return service.updateById(database);
    }

    /**
     * 查询所有数据库列表。
     * 不包括已删除对象，包括已停用对象。
     *
     * @return 所有数据
     */
    @GetMapping("list")
    public List<MetaDatabaseVO> list() {
//        return service.list();
        List<MetaDatabaseDTO> databases = service.listWithRelation();
        List<MetaDatabaseVO> list = new ArrayList<>();
        for (MetaDatabaseDTO dto : databases) {
            list.add(new MetaDatabaseVO(dto));
        }
        return list;
    }

    /**
     * 根据Id获取指定数据库对象。
     *
     * @param id 数据库Id
     * @return 返回数据库对象，Id无效返回NULL
     */
    @GetMapping("getInfo/{id}")
    public MetaDatabase getInfo(@PathVariable Integer id) {
        return service.getById(id);
    }

    /**
     * 分页查询数据库对象列表
     *
     * @param page 分页对象
     * @return 分页对象
     */
    @GetMapping("page")
    public Page<MetaDatabase> page(Page<MetaDatabase> page) {
        return service.page(page);
    }

}
